package client

import (
	"Blockchain/block"
	"Blockchain/tools"
	"flag"
	"fmt"
	"os"
)

/*
用户的程序交互接口
只负责读取用户传递过来的命令和参数，并且进行解析
解析后，调用程序的具体功能
*/
type Cli struct {
}

func (cl *Cli) Run() {
	//获取用户输入的信息
	args := os.Args
	//确定当前系统有哪些功能
	/*
		1.创建一个带有创世区块的区块链  参数：创世区块的交易信息
		main.exe  createchain --data "wdfuck"
		2.向区块链中添加新区块 参数：新区块的交易信息
		main.exe addblock --data "sewxx"
		3.查看区块链中所有区块的信息
		main.exe printblock 参数：无
		4.获取区块链中区块的个数 参数：无
		main.exe getblockcount
		5.输出当前系统的使用说明 参数：无
		mian.exe help
	*/

	createchain := flag.NewFlagSet("createchain", flag.ExitOnError)
	switch args[1] {
	case "createchain"://创建一个带有创世区块的区块链
		data := createchain.String("data", "", "创世区块的交易信息")
		createchain.Parse(args[2:])
		//判断区块链是否存在 判断chain.db是否存在
		exist := tools.FileExist("./chain.db")
		if exist {
			fmt.Println("区块链已经存在")
			return
		}
		bc, err := block.CreateChain([]byte(*data))
		defer bc.DB.Close()
		if err != nil {
			fmt.Println(err.Error())
			return
		}
		fmt.Println("区块链创建成功")


	case "addblock"://向区块链中添加新区块
		s := createchain.String("data", "", "添加")
		createchain.Parse(args[2:])
		bc, err := block.CreateChain([]byte(*s))
		bc.AddBlock([]byte(*s))
		defer bc.DB.Close()
		if err !=nil {
			fmt.Println(err.Error())
			return
		}
		fmt.Println("区块链添加成功")

	case "printblock"://查看区块链中所有区块的信息
		s := createchain.String("", "", "添加")
		createchain.Parse(args[2:])
		bc, err := block.CreateChain([]byte(*s))
		iterator := bc.Iterator()
		for{
			if iterator.HasNext(){
				block, err := iterator.Next()
				if err !=nil{
					fmt.Println(err.Error())
					break
				}
				fmt.Println(string(block.Data))
			}else{

				break
			}
		}
		defer bc.DB.Close()
		if err !=nil {
			fmt.Println(err.Error())
			return
		}

	case "getblockcount"://获取区块链中区块的个数
		s := createchain.String("", "", "添加")
		createchain.Parse(args[2:])
		bc, err := block.CreateChain([]byte(*s))
		iterator := bc.Iterator()
		var a = 0
		for{
			if iterator.HasNext(){
				_, err := iterator.Next()
				if err !=nil{
					fmt.Println(err.Error())
					break
				}
				a=a+1
			}else{
				break
			}
		}
		fmt.Println(a)
		defer bc.DB.Close()
		if err !=nil {
			fmt.Println(err.Error())
			return
		}

	case "help"://输出当前系统的使用说明

		createchain.Parse(args[2:])
		fmt.Println("创建区块")
		fmt.Println("添加区块")
		fmt.Println("查看区块链中所有区块的信息")
		fmt.Println("获取区块链中区块的个数")
		return

	default:
		fmt.Println("没有对应的功能")
		os.Exit(1)

	 }

}
